class Solution {
public:
    int minNumberOfFrogs(string c) {
        // 下面这种写法是普适性的
        // 依然使用数组模拟哈希表
        string t = "croak";
        int n = t.size();
        vector<int> hash(n);

        // [x, x这个字符所对应的下标]
        unordered_map<char, int> index;

        // 存储下标映射关系
        for(int i = 0; i < n; i++)
            index[t[i]] = i;

        // 遍历蛙鸣字符串
        for(char ch : c)
        {
            if(ch == t[0]) /* ch == 'c' */
            {
                hash[0]++;
                if(hash[n - 1] > 0) hash[n - 1]--;
            }
            else
            {
                if(hash[index[ch] - 1] == 0)
                    return -1;
                hash[index[ch] - 1]--;
                hash[index[ch]]++;
            }
        }

        // 如果hash表中还有其他元素(除了最后一个元素之外)有不为0的，说明叫声不完整
        // 比如这个例子"croa"，上面不会return的
        for(int i = 0; i < n - 1; i++)
            if(hash[i] != 0)
                return -1;
        return hash[n - 1];

        // 下面这种写法是不通用的，只针对于本道题的"croak"
        // unordered_map<char, int> hash;
        // int hash[5] = { 0 };
        // int n = c.size();
        // for(int i = 0; i < n; i++)
        // {
        //     if(c[i] == 'c')
        //     {
        //         hash[0]++;
        //         if(hash[4] > 0)
        //             hash[4]--;
        //     }
        //     else if(c[i] == 'r')
        //     {
        //         if(hash[0] == 0) 
        //             return -1;
        //         hash[0]--;
        //         hash[1]++;
        //     }
        //     else if(c[i] == 'o')
        //     {
        //         if(hash[1] == 0) 
        //             return -1;
        //         hash[1]--;
        //         hash[2]++;
        //     }
        //     else if(c[i] == 'a')
        //     {
        //         if(hash[2] == 0) 
        //             return -1;
        //         hash[2]--;
        //         hash[3]++;
        //     }
        //     else if(c[i] == 'k')
        //     {
        //         if(hash[3] == 0) 
        //             return -1;
        //         hash[3]--;
        //         hash[4]++;
        //     }
        // }

        // if(hash[0] != 0 || hash[1] != 0 || hash[2] != 0 || hash[3] != 0) return -1;
        // else return hash[4];
    }
};